package funcs

import (
	"strings"
	"unicode"

	"golang.org/x/text/cases"
	"golang.org/x/text/language"
)

// ToGreatHump 将字符串中的单词转换为驼峰命名法。
// 它接受一个字符串参数 s，该字符串可能包含空格、下划线或连字符作为单词分隔符。
// 函数返回一个新的字符串，其中每个单词的首字母大写，其余字母小写，单词间没有空格、下划线或连字符。
func ToGreatHump(s string) string {
	// 使用FieldsFunc函数根据空格、下划线和连字符分割字符串s成单词列表。
	// 这里我们定义了一个匿名函数来判断哪些字符应该作为单词的分隔符。
	words := strings.FieldsFunc(s, func(r rune) bool {
		return unicode.IsSpace(r) || r == '_' || r == '-'
	})

	// 遍历单词列表，对每个单词应用驼峰命名法转换。
	for i, word := range words {
		// 使用golang.org/x/text/cases包中的Title函数将每个单词转换为驼峰命名法。
		// Title函数将单词的首字母大写，其余字母小写。
		// language.Und表示使用通用语言设置，cases.NoLower表示不将单词的其余部分转换为小写。
		words[i] = cases.Title(language.Und, cases.NoLower).String(word)
	}
	// 使用strings.Join将转换后的单词列表连接成一个字符串，单词之间没有分隔符。
	return strings.Join(words, "")
}

// ToLittleHump 将输入字符串转换为小驼峰形式。
// 接受一个字符串，该字符串可能包含下划线或连字符作为单词分隔符，
// 并将每个单词的首字母大写（除了第一个单词），其余字母不变，然后连接起来形成小驼峰命名的字符串。
func ToLittleHump(s string) string {
	// 使用FieldsFunc根据下划线和连字符分割字符串
	words := strings.FieldsFunc(s, func(r rune) bool {
		return r == '_' || r == '-'
	})

	// 初始化cases.Title实例，用于文本大小写转换
	caser := cases.Title(language.Und)

	// 处理第一个单词，保持小写
	if len(words) > 0 {
		words[0] = strings.ToLower(words[0])
	}

	// 对除第一个单词以外的所有单词应用Title case转换
	for i := 1; i < len(words); i++ {
		words[i] = caser.String(words[i])
	}

	// 连接处理后的单词为一个字符串
	return strings.Join(words, "")
}
